/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package persistencia.controller

import persistencia.conexao.IConexao;
import persistencia.conexao.Conexao;
import groovy.sql.Sql;
import persistencia.controller.ICondicaoController;
import bean.CondicaoCompra;
import bean.CondicaoCompraParcela;
import bean.BuscaChaveEstrangeira;
import org.postgresql.util.PSQLException;
import java.util.Vector;

/**
 *
 * @author André
 */
class CondicaoController implements ICondicaoController{

    def boolean createCondicao(CondicaoCompra condicao){

        Sql bd = null;
        try{
            bd = Conexao.getInstance().getConexao();
            //java.util.Date dataUtil = new java.util.Date();

            println "tamanho das criancas: " + condicao.getCondicaoCompraParcelaList().size()
            java.sql.Date dataSql = new java.sql.Date(new Date().getTime());
            def data = dataSql;
            def descricao = condicao.getTdescricao();
            def formaParcelamento = condicao.getTforma_parcelamento_chk();
            def qtdeParcelas = condicao.getTquantidade_parcelas();
            def possuiEntrada = condicao.getTpossui_entrada_chk();
            def grupoComissao = condicao.getTgrupo_comissao_fk();

            def sql = "BEGIN;"

            def sqlCondicaoCompra = "insert into " +
            "compras.tcondicao_compra(tdata_cadastro, tdescricao, tforma_parcelamento_chk, " +
            "tquantidade_parcelas, tpossui_entrada_chk, tgrupo_comissao_fk) " +
            "values(?,?,?,?,?,?);"

            sql = sql.concat(sqlCondicaoCompra);
            
            def sqlCondicaoParcelas = "insert into " +
            "compras.tcondicao_compra_parcela(tparcela_pk, tnum_dias_vencimento, " +
            "tpercentual_parcela, tvencimento_fixo_chk, tdia_vencimento1, tdia_vencimento2) " +
            "values(?,?,?,?,?,?);";

            //ANTES DE INICIAR AS TRANSAÇÕES FAZER O BEGIN E NO FINAL FAZER O COMMIT
            
            def lista = [data, descricao, formaParcelamento, qtdeParcelas, possuiEntrada, grupoComissao];
            
            //bd.execute(sqlCondicaoPreco, listaCondicao);

            for(CondicaoCompraParcela i : condicao.getCondicaoCompraParcelaList()){

                sql = sql.concat(sqlCondicaoParcelas);
                
                def parcela = i.getTparcela_pk();
                def diasVencimento = i.getTnum_dias_vencimento();
                def percParcela = i.getTpercentual_parcela();
                def vencFixo = i.getTvencimento_fixo_chk();
                def dia1 = i.getTdia_vencimento1();
                def dia2 = i.getTdia_vencimento2();

                def listaParcelas = [parcela, diasVencimento, percParcela, vencFixo, dia1, dia2];
                //bd.execute(sqlCondicaoMercadorias, listaMercadorias);

                lista = lista + listaParcelas;
            }
            sql = sql.concat("COMMIT;")
            //bd.commit();
            //println "SQL: " + sql;
            //println "VALUES: " + lista;
            bd.execute(sql, lista);
            

            return true;
        }
        catch(PSQLException e){
            System.err.println("PSQLException - CondicaoController.create(): " + e.getMessage());
            e.printStackTrace();
            if(bd != null){
                bd.rollback();
            }
            return false;
        }
        catch(Exception e){
            System.err.println("Exception - CondicaoController.create(): " + e);
            e.printStackTrace();
            if(bd != null){
                bd.rollback();
            }
            return false;
        }
    }

    def Vector<CondicaoCompra> readCondicao(String descricao){

        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sqlMae = "SELECT * FROM compras.tcondicao_compra WHERE tdescricao ~* " + "'" + descricao + "'";
            Vector<CondicaoCompra> listMae = new Vector<CondicaoCompra>();
            Vector<CondicaoCompraParcela> listFilha = new Vector<CondicaoCompraParcela>();

            bd.eachRow(sqlMae){
                listMae.add(new CondicaoCompra(it.toRowResult()));
            }

            if(listMae.isEmpty()){
                CondicaoCompraParcela p = new CondicaoCompraParcela()
                listFilha.add(p);
                CondicaoCompra c = new CondicaoCompra();                
                c.setCondicaoCompraParcelaList(listFilha);
                listMae.add(c);
                return listMae;
            }
                

            for(CondicaoCompra i : listMae){
                def sqlFilha = "SELECT * FROM compras.tcondicao_compra_parcela WHERE " +
                      "tcodigo_fpk = " + i.getTcodigo_pk();
                bd.eachRow(sqlFilha){
                    //result << it.toRowResult()
                    listFilha.add(new CondicaoCompraParcela(it.toRowResult()));                    
                }
                i.setCondicaoCompraParcelaList(new Vector(listFilha));
                listFilha.clear();
            }

            return listMae;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    def CondicaoCompra readCondicaoPorId(Integer codigoCondicao){

        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sqlMae = "SELECT * FROM compras.tcondicao_compra WHERE tcodigo_pk = " + codigoCondicao;
            def sqlFilha = "SELECT * FROM compras.tcondicao_compra_parcela WHERE " +
                      "tcodigo_fpk = " + codigoCondicao;
        
            Vector<CondicaoCompraParcela> list = new Vector<CondicaoCompraParcela>();
            CondicaoCompra condicao = new CondicaoCompra();
        
            bd.eachRow(sqlFilha){
                //result << it.toRowResult()
                list.add(new CondicaoCompraParcela(it.toRowResult()));
            }

            bd.eachRow(sqlMae){
                condicao = new CondicaoCompra(it.toRowResult());
                //println "SQL mae: " + cot;
            }

            if(list.isEmpty()){
                list.add(new CondicaoCompraParcela());
            }

            condicao.setCondicaoCompraParcelaList(list);

            return condicao;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }


    def boolean deleteCondicao(Integer codigoCondicao){

        Sql bd = null;
        try{
            bd = Conexao.getInstance().getConexao();

            def sql = "BEGIN;"

            def sqlFilha = "DELETE FROM compras.tcondicao_compra_parcela WHERE tcodigo_fpk = ?;";
            sql = sql.concat(sqlFilha);
            def sqlMae = "DELETE FROM compras.tcondicao_compra WHERE tcodigo_pk = ?;";
            sql = sql.concat(sqlMae);

            sql = sql.concat("COMMIT;")
            
            def lista = [codigoCondicao, codigoCondicao];

            bd.execute(sql, lista);
            return true;
                
        }
        catch(Exception e){
            e.printStackTrace();
            if(bd != null){
                bd.rollback();
            }
            return false;
        }
    }
    def boolean updateCondicao(CondicaoCompra condicao){

        Sql bd = null;
        try{
            bd = Conexao.getInstance().getConexao();
            
            def codigo = condicao.getTcodigo_pk();
            def descricao = condicao.getTdescricao();
            def formaParcelamento = condicao.getTforma_parcelamento_chk();
            def qtdeParcelas = condicao.getTquantidade_parcelas();
            def possuiEntrada = condicao.getTpossui_entrada_chk();
            def grupoComissao = condicao.getTgrupo_comissao_fk();

            def sql = "BEGIN;"

            //ANTES FAZ O DELETE DE TODOS OS REGISTROS FILHOS
            def sqlDeleteFilhos = "DELETE FROM compras.tcondicao_compra_parcela WHERE tcodigo_fpk = ?;";
            sql = sql.concat(sqlDeleteFilhos);

            def sqlCondicaoCompra = "UPDATE compras.tcondicao_compra SET " +
            "tdescricao = ?, tforma_parcelamento_chk = ?, " +
            "tquantidade_parcelas = ?, tpossui_entrada_chk = ?, tgrupo_comissao_fk = ? " +
            "WHERE tcodigo_pk = ?;"

            sql = sql.concat(sqlCondicaoCompra);

            def sqlCondicaoParcelas = "insert into " +
            "compras.tcondicao_compra_parcela(tcodigo_fpk, tparcela_pk, tnum_dias_vencimento, " +
            "tpercentual_parcela, tvencimento_fixo_chk, tdia_vencimento1, tdia_vencimento2) " +
            "values(?,?,?,?,?,?,?);";

            def lista = [codigo, descricao, formaParcelamento, qtdeParcelas, possuiEntrada, grupoComissao, codigo];

            for(CondicaoCompraParcela i : condicao.getCondicaoCompraParcelaList()){

                sql = sql.concat(sqlCondicaoParcelas);

                def parcela = i.getTparcela_pk();
                def diasVencimento = i.getTnum_dias_vencimento();
                def percParcela = i.getTpercentual_parcela();
                def vencFixo = i.getTvencimento_fixo_chk();
                def dia1 = i.getTdia_vencimento1();
                def dia2 = i.getTdia_vencimento2();

                def listaParcelas = [codigo, parcela, diasVencimento, percParcela, vencFixo, dia1, dia2];
                
                lista = lista + listaParcelas;
            }
            sql = sql.concat("COMMIT;")
            bd.execute(sql, lista);


            return true;
        }
        catch(PSQLException e){
            System.err.println("PSQLException - CondicaoController.updateCondicao(): " + e.getMessage());
            e.printStackTrace();
            if(bd != null){
                bd.rollback();
            }
            return false;
        }
        catch(Exception e){
            System.err.println("Exception - CondicaoController.updateCondicao(): " + e);
            e.printStackTrace();
            if(bd != null){
                bd.rollback();
            }
            return false;
        }
    }

    def Vector<BuscaChaveEstrangeira> searchGrupoPorId(Integer codigo) {
        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sql = "SELECT * FROM gestao_vendas.tgrupo_comis_cond_venda WHERE " +
                      "tcodigo_pk = " + codigo;

            Vector<BuscaChaveEstrangeira> list = new Vector<BuscaChaveEstrangeira>();

            bd.eachRow(sql){
                Map m = it.toRowResult();
                BuscaChaveEstrangeira fk = new BuscaChaveEstrangeira();
                fk.setId(m.tcodigo_pk);
                fk.setNome(m.tdescricao);

                list.add(fk);
            }
            if(list.isEmpty())
            return null;

            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    def Vector<BuscaChaveEstrangeira> searchGrupoPorNome(String descricao) {
        try{
            Sql bd = Conexao.getInstance().getConexao();

            def sql = "SELECT * FROM gestao_vendas.tgrupo_comis_cond_venda WHERE " +
                      "tdescricao ~* " + "'" + descricao + "'";
            //def sql = "SELECT * FROM compras.tfornecedor";

            Vector<BuscaChaveEstrangeira> list = new Vector<BuscaChaveEstrangeira>();

            bd.eachRow(sql){
                Map m = it.toRowResult();
                BuscaChaveEstrangeira fk = new BuscaChaveEstrangeira();
                fk.setId(m.tcodigo_pk);
                fk.setNome(m.tdescricao);

                list.add(fk);
            }
            if(list.isEmpty())
            return null;

            return list;
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }
}

